package com.xc.tool.utils;


import com.xc.tool.annotation.Config;
import com.xc.tool.annotation.ConfigField;

import java.lang.reflect.Field;

/**
 * <p>项目名称: Stars</p>
 * <p>描述: 解析Config和ConfigField注解</p>
 * <P>创建人: 小程</p>
 * <P>创建人邮箱: 779943476@qq.com</p>
 * <p>创建时间: 2019/7/18</p>
 *
 * @version v1.0
 */
public class ConfigAnalysis {


    /**
     * <p>功能描述:初始化配置类</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param clazz 配置类class
     */
    public static void initConfig(Class<?> clazz) {
        try {
            String entityValue = null;
            String configFile = null;
            Field[] fields = clazz.getDeclaredFields();
            if (clazz.isAnnotationPresent(Config.class)) {
                entityValue = clazz.getAnnotation(Config.class).value();
                configFile = clazz.getAnnotation(Config.class).configFile();
            }
            if (!"".equals(configFile)) {
                PropertiesUtils.initProperties(configFile);
            }
            for (Field field : fields) {
                if (field.isAnnotationPresent(ConfigField.class)) {
                    // Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false使用了method.setAccessible(true)后 性能有了20倍的提升
                    field.setAccessible(true);
                    String value = null;
                    String attr = field.getAnnotation(ConfigField.class).value();
                    if (!entityValue.equals("")) {
                        if (!attr.equals("")) {
                            value = entityValue + "." + attr;
                        } else {
                            value = field.getName();
                        }
                    } else {
                        if (!attr.equals("")) {
                            value = attr;
                        } else {
                            value = field.getName();
                        }
                    }
                    value = PropertiesUtils.getProperty(value);
                    if (value != null) {
                        field.set(clazz, typeConversion(value, field.getGenericType().toString()));
                    }
                } else {
                    // Accessible并不是标识方法能否访问的. public的方法 Accessible仍为false使用了method.setAccessible(true)后 性能有了20倍的提升
                    field.setAccessible(true);
                    String value = null;
                    if (entityValue.equals("")) {
                        value = field.getName();
                    } else {
                        value = entityValue + "." + field.getName();
                    }
                    value = PropertiesUtils.getProperty(value);
                    if (value != null) {
                        field.set(clazz, typeConversion(value, field.getGenericType().toString()));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * <p>功能描述:初始化配置类</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param value 对象项
     * @param type  类型
     * @return 转换后的类型
     */
    private static Object typeConversion(String value, String type) {
        if ("boolean".equals(type)) {
            return Boolean.parseBoolean(value);
        } else if ("long".equals(type)) {
            return Long.parseLong(value);
        } else if ("int".equals(type)) {
            return Integer.parseInt(value);
        } else if ("byte".equals(type)) {
            return Byte.parseByte(value);
        } else if ("short".equals(type)) {
            return Short.parseShort(value);
        } else if ("float".equals(type)) {
            return Float.parseFloat(value);
        } else if ("double".equals(type)) {
            return Double.parseDouble(value);
        }
        return value;
    }
}
